██████╗ ███████╗████████╗██╗██████╗ ███████╗██████╗ ██╗ █████╗
██╔══██╗██╔════╝╚══██╔══╝██║██╔══██╗██╔════╝██╔══██╗██║██╔══██╗
██████╔╝█████╗ ██║ ██║██████╔╝█████╗ ██║ ██║██║███████║
██╔══██╗██╔══╝ ██║ ██║██╔═══╝ ██╔══╝ ██║ ██║██║██╔══██║
██║ ██║███████╗ ██║ ██║██║ ███████╗██████╔╝██║██║ ██║
╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝╚═╝ ╚══════╝╚═════╝ ╚═╝╚═╝ ╚═╝
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
RTTI
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
La mwawRTTI (mwbaRunTime Type Information o mwbqRunTime Type Identification) consente ai mwbgprogrammi che manipolano mwbwpuntatori e riferimenti ad oggetti di una mwcaclasse base, di determinare il tipo dell'oggetto durante l'mwcqesecuzione invece che solo al momento della mwcgcompilazione.
Questa caratteristica è utile nei programmi in cui si ha l'esigenza di aggiungere una qualche mwdafunzione virtuale ad una gerarchia di classi, ma non si ha accesso al mwdqcodice sorgente di queste classi. Infatti, l'aggiunta di questa funzione personale comporta la ricompilazione di tutte le funzioni membro che ne fanno uso. Questo è particolarmente vero per le mwdglibrerie realizzate da terze parti: si hanno a disposizione soltanto i file header e la versione già compilata, ma non il codice sorgente. In questa situazione non è possibile effettuare la ricompilazione.
Per i dettagli su come gestire questa caratteristica si rimanda alla documentazione del proprio mwealinguaggio di programmazione.
RTTI, come termine è tipicamente utilizzato in relazione al mwegC++. Per far sì che le operazioni che coinvolgono il mwewmwfadynamic_cast<>, l'operatore mwfqtypeid o le eccezioni funzionino in C++, l'RTTI deve essere abilitato.
Contents
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Esempio in C++
/*
* Un puntatore ad una classe base può puntare a oggetti di ogni classe che sia
* derivata da essa.
* L'RTTI è utile per identificare quale tipo di (classe derivata) oggetto sia
* puntato da un puntatore di classe base.
*/
#include <iostream>
class Abc // classe base
{
public:
virtual void hello()
{
std::cout << "in Abc";
}
};
class Xyz : public Abc
{
public:
void hello()
{
std::cout << "in Xyz";
}
};
int main()
{
Abc *abc_pointer = new Xyz();
Xyz *xyz_pointer;
// per capire se abc_pointer sta puntando a un oggetto di tipo Xyz
xyz_pointer = dynamic_cast<Xyz*>(abc_pointer);
if (xyz_pointer != nullptr) {
std::cout << "il puntatore abc sta puntando ad un oggetto di tipo Xyz"; // identificato
} else {
std::cout << "il puntatore abc NON sta puntando ad un oggetto di tipo Xyz";
}
return 0;
}
Un esempio in cui l'RTTI è utilizzato è illustrato qui sotto:
class Base {
virtual ~Base(){}
};
class Derivata : public Base {
public:
virtual ~Derivata(){}
int compara (Derivata &ref);
};
int mio_metodo_di_comparazione_per_un_sort_generico (Base &ref1, Base &ref2)
{
Derivata & d = dynamic_cast<Derivata &>(ref1); // RTTI usato qui
// RTTI fa lanciare al processo una bad_cast exception
// se il cast non ha successo
return d.compara (dynamic_cast<Derivata &>(ref2));
}
Collegamenti esterni
• citereffoldoc(EN) Denis Howe, Run-Time Type Information, in Free On-line Dictionary of Computing. Disponibile con licenza mwav8GFDL